package br.com.comanda.dao.autosql.validation;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import br.com.comanda.dao.autosql.annotations.validation.MatchRegex;
import br.com.comanda.dao.autosql.exception.ValidationException;
import br.com.comanda.dao.autosql.metadadoscache.MetaDadosCache;
import br.com.comanda.dao.autosql.metadadoscache.MetaDadosExtractor;

/**
 * Classe para fazer a validacao de um objeto antes de persistir no banco de
 * dados
 * 
 * @author Thiago
 * @since 09/01/2013
 */
public class CheckValidation {

	/**
	 * Valida se os dados do objeto estao informados de acordo com as anotacoes
	 * de validacao
	 */
	public static void isValid(Object object, Class<?> clazz)
			throws NoSuchMethodException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException,
			ValidationException {
		List<MetaDadosCache> cache = MetaDadosExtractor.extract(clazz);

		for (MetaDadosCache metaDado : cache) {
			if (metaDado.getField().isAnnotationPresent(MatchRegex.class)) {
				String value = (String) metaDado.getGet().invoke(object);
				MatchRegex validation = metaDado.getField().getAnnotation(
						MatchRegex.class);

				Pattern p = Pattern.compile(validation.regex());
				Matcher m = p.matcher(value);

				if (!m.matches()) {
					throw new ValidationException(validation.customMessage());
				}
			}
		}
	}
}
